package cn.felord;

import cn.felord.util.ClientUtil;
import cn.felord.wepay.common.exception.PayException;
import cn.felord.wepay.common.pay.Payable;
import cn.felord.wepay.common.pay.PreBusinessService;
import cn.felord.wepay.wechat.entity.Bill;
import cn.felord.wepay.wechat.entity.PayRequestParams;
import cn.felord.wepay.wechat.enumeration.OrderIdTypeEnum;

import java.util.List;
import java.util.Map;

import static cn.felord.wepay.common.pay.Constant.BILL_KEY;
import static cn.felord.wepay.common.pay.Constant.PARAMS_KEY;

/**
 * 支付demo.
 *
 * @author Dax
 * @version v1.0.0
 * @since 2017/8/29  10:30
 */


public class PayDemo {

    public static void main(String[] args) throws PayException {

        // 选择加密 或者不加密（空实现或者null）      实现预先处理业务 即在向微信服务器发起支付请求前的业务  空实现 或者null 表示没有业务处理
        Payable payProxy = ClientUtil.getPayProxy(null, new PreBusinessService() {
            @Override
            public <T> T preHandler(Map<String, Object> result) {
//                  通过下面可以取得 请求参数 进行处理业务    KEY后续会被 CollectionKeyEnum  枚举代替  不再使用接口定义常量  源码中 已经使用枚举  当然 可以打印一下  看k-v对处理
                PayRequestParams payRequestParams = (PayRequestParams) result.get(PARAMS_KEY);
                return null;
            }
        });


        PayRequestParams payRequestParams = new PayRequestParams();
        payRequestParams.setSpbill_create_ip("192.168.0.1");
        payRequestParams.setOut_trade_no("20170829xxxxxx");
        payRequestParams.setBody("微信支付-test");

//        单位为分  切记
        payRequestParams.setTotal_fee(10000);
//        其他基础性参数可自动注入   非必传参数    自行注入
//        app支付     开启开发模式     可验证参数      进行调试       map返回给 app端处理
        Map<String, Object> map = payProxy.payByApp(payRequestParams);


//        微信公众号 需要传入openid
        payRequestParams.setOpenid("dsfsdfasfasfadfasfadfasdfafdasdfasdfasf");
        Map<String, Object> jsmap = payProxy.payByJsApi(payRequestParams);


//        账单查询 时间参数格式为 yyyyMMdd
        Map<String, Object> bills = payProxy.billDownload("yyyyMMdd");
        //                  通过下面可以取得 Bill 集合  进行处理业务    KEY 后续会被 CollectionKeyEnum  枚举代替  不再使用接口定义常量  源码中 已经使用枚举  当然 可以打印一下  看k-v对处理
        List<Bill> billList = (List<Bill>) bills.get(BILL_KEY);


//      通过商户订单编号 向查询支付信息   参见微信文档之查询
        String orderId = "20170829xxxxxx";
        payProxy.orderQuery(orderId, OrderIdTypeEnum.OUT_TRADE_NO);
//      通过微信订单号查询支付信息
        String transactionId = "2017114232323241113111";
        payProxy.orderQuery(transactionId, OrderIdTypeEnum.TRANSACTION_ID);
        /**
         *
         *
         * 其他例子不再详解 大同小异  发现bug 请 issue
         *
         */

    }
}
